#-*- codeing = utf-8 -*-
#@Time : 2020/10/21 16:03
#@Author : 阳某
#@File : Pandas怎样实现groupby聚合后字符串列的合并.py
#@Software : PyCharm

'''
需求：
计算每个月的最高温度、最低温度、出现的风向列表、出现的空气质量列表
'''
import pandas as pd
df = pd.read_csv("./datas/beijing_tianqi/beijing_tianqi_2018.csv")
print(df.head())
# 知识：使用df.info()可以查看每列的类型
print(df.info())

print(df.sample(5))
print('*******')
# 知识：series怎样从str类型变成int
df["bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32')
df["yWendu"] = df["yWendu"].str.replace("℃", "").astype('int32')
print(df.head(3))

# 知识：进行日期列解析，可以方便提取月份
df["ymd"] = pd.to_datetime(df["ymd"])
print(df["ymd"].dt.month)

# 知识：series可以用Series.unique去重
print(df["fengxiang"].unique())
# 知识：可以用",".join(series)实现数组合并成大字符串
print(",".join(df["fengxiang"].unique()))
# 方法1
result = (
    df.groupby(df["ymd"].dt.month)
      .agg(
          # 新列名 = (原列名，函数)
          最高温度=("bWendu", "max"),
          最低温度=("yWendu", "min"),
          风向列表=("fengxiang", lambda x : ",".join(x.unique())),
          空气质量列表=("aqiInfo", lambda x : ",".join(x.unique()))
      )
      .reset_index()
      .rename(columns={"ymd":"月份"})
)
print(result)
# 方法2

def agg_func(x):
    """注意，这个x是每个分组的dataframe"""
    return pd.Series({
        "最高温度": x["bWendu"].max(),
        "最低温度": x["yWendu"].min(),
        "风向列表": ",".join(x["fengxiang"].unique()),
        "空气质量列表": ",".join(x["aqiInfo"].unique())
    })
result = df \
        .groupby(df["ymd"].dt.month) \
        .apply(agg_func) \
        .reset_index() \
        .rename(columns={"ymd":"月份"})
print(result)